//
//  LRStatusDetailViewController.swift
//  LRWeibo
//
//  Created by 雷路荣 on 15/12/26.
//  Copyright © 2015年 leilurong. All rights reserved.
//

/**
*  微博详情控制器
*/
import UIKit
import SVPullToRefresh
import SVProgressHUD

///cell重用标识
enum LRStatusDetailIdentifier: String {
    case DetailStatusOriginalCell = "DetailStatusOriginalCell" //原创cell重用标识
    case DetailStatusTransmiteCell = "DetailStatusTransmiteCell" //转发cell重用标识
    case DetailCommentCell = "DetailCommentCell" //评论cell重用标识
    case DetailLoadingCommentCell = "DetailLoadingCommentCell" //正在加载评论cell重用标识
    case DetailNoCommentCell = "DetailNoCommentCell" //暂无评论cell重用标识
    /// 判断返回对应的cellId
    static func cellId(obj: AnyObject) -> String {
        if obj is LRStatues { //如果是微博模型
            return (obj as! LRStatues).retweeted_status == nil ? DetailStatusOriginalCell.rawValue : DetailStatusTransmiteCell.rawValue
        }else if obj is LRCommentModel {//是评论模型
            return (obj as! LRCommentModel).loading ? DetailLoadingCommentCell.rawValue : DetailCommentCell.rawValue
        }
        return DetailStatusOriginalCell.rawValue
    }
}

class LRStatusDetailViewController: UIViewController {//继承UIViewController

    /// 微博模型属性
    private var statues: LRStatues
    /// 创建评论模型空数组
    private var comments: [LRCommentModel] = [LRCommentModel]()
    /// MARK: - 构造函数
    init(statues: LRStatues) {
        self.statues = statues
        super.init(nibName: nil, bundle: nil)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    deinit {
        print("详情控制器销毁")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "微博详情"
        //隐藏组间距
        self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0)
        prepareUI()
        prepareTableView()
    }
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        //加载新评论
        loadNewComment()
    }
    //添加子控件
    private func prepareUI() {
        view.addSubview(tableView)
        view.addSubview(bottomView)
        //取消Autoresizing
        tableView.translatesAutoresizingMaskIntoConstraints = false
        bottomView.translatesAutoresizingMaskIntoConstraints = false
        //tableView水平屏幕宽度
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tv" : tableView]))
        //bottomView水平屏幕宽度
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[bv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["bv" : bottomView]))
        //垂直方向，bottomView高度44，tableView在其上方距离0
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[tv]-0-[bv(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["tv":tableView,"bv":bottomView]))
        
    }
    //设置tableView
    private func prepareTableView() {

        //设置背景色
        tableView.backgroundColor = UIColor(white: 0.9, alpha: 1)
        //设置预估高度
        tableView.estimatedRowHeight = 368
        //注册cell
        tableView.registerClass(LRStatuesOriginalCell.self, forCellReuseIdentifier: LRStatusDetailIdentifier.DetailStatusOriginalCell.rawValue)
        
        tableView.registerClass(LRStatuesTransmitCell.self, forCellReuseIdentifier: LRStatusDetailIdentifier.DetailStatusTransmiteCell.rawValue)
        
        tableView.registerClass(LRCommentCell.self, forCellReuseIdentifier: LRStatusDetailIdentifier.DetailCommentCell.rawValue)
        
        tableView.registerClass(LRLoadingCommentCell.self, forCellReuseIdentifier: LRStatusDetailIdentifier.DetailLoadingCommentCell.rawValue)
        
        tableView.registerClass(LRNoCommentCell.self, forCellReuseIdentifier: LRStatusDetailIdentifier.DetailNoCommentCell.rawValue)
        //设置代理
        tableView.delegate = self
        tableView.dataSource = self
        // 添加上拉加载更多控件
        tableView.addInfiniteScrollingWithActionHandler { () -> Void in
           // 加载更多评论数据
           self.loadMoreComment()
        }
        tableView.tableFooterView = UIView()
    }
    //MARK: - 懒加载------
    ///tableView
    private lazy var tableView = UITableView(frame: CGRectZero, style: UITableViewStyle.Grouped)
    ///评论头部View
    private lazy var commentsListHeaderView: LRCommentsListHeaderView = {
        let view = LRCommentsListHeaderView()
        view.status = self.statues
        view.delegate = self
        return view
    }()
    ///底部View
    private lazy var bottomView: LRCellBottomView = {
        let view = LRCellBottomView()
        //view.statuses = self.statues 这里不需要显示数量
        view.delegate = self
        return view
    }()

}

// MARK: - 扩展遵守多个代理协议及实现多个代理方法------------------------------------------------
extension LRStatusDetailViewController:LRCommentsListHeaderViewDelegate,LRCellBottomViewDelegate,LRStatuesCellDelegate {
    ///MARK: - 加载新的评论数据
    func loadNewComment() {
        let since_id = comments.first?.id ?? 0
        // 添加 正在加载数据的cell
        let commentModel = LRCommentModel(loading: true)
        //添加数据到数组最前面
        comments.insert(commentModel, atIndex: 0)
        //刷新
        tableView.reloadData()
        //动画滚动到第2组第0个cell
        tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 1), atScrollPosition: UITableViewScrollPosition.Top, animated: true)
        //加载评论数据
        LRCommentModel.loadComments(statues.id, since_id: since_id, max_id: 0) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            // 移除正在加载数据的cell
            self.comments.removeFirst()
            if error != nil {
                print("加载最新评论失败: \(error)")
                SVProgressHUD.showErrorWithStatus("加载最新评论失败")
                self.tableView.reloadData()
                return
            }
            //print("加载最新评论成功:\(comments?.count), next_cursor: \(next_cursor)")
            //此次加载到的总数量
            self.statues.comments_count = total_number!
            //SVProgressHUD.showWithStatus("加载 \(comments?.count ?? 0) 条最新评论")
            // 判断是否加载到数据
            if comments != nil && comments?.count > 0 {
                //将数据添加到数组前面 顺序不能反了
                self.comments = comments! + self.comments
            }
            self.tableView.reloadData()
        }
        
        
    }
    ///MARK: - 加载更多评论数据（旧的数据）
    func loadMoreComment() {
        let max_id = comments.last?.id ?? 0
        LRCommentModel.loadComments(statues.id, since_id: 0, max_id: max_id) { (comments, total_number, previous_cursor, next_cursor, error) -> () in
            // 停止之前的上拉加载更多数据动画
            self.tableView.infiniteScrollingView.stopAnimating()
            
            if error != nil {
                SVProgressHUD.showErrorWithStatus("加载更多评论失败")
                print("加载更多评论失败: \(error)")
                return
            }
            //print("加载更多评论成功:\(comments?.count), next_cursor: \(next_cursor)")
//            SVProgressHUD.showInfoWithStatus("加载 \(comments?.count ?? 0) 条更多评论")   
            //加载到的数量
            self.statues.comments_count = total_number!
            //下一页没有评论时再上拉就不显示菊花
            self.tableView.showsInfiniteScrolling = next_cursor != 0
            // 判断是否加载到数据
            if comments != nil && comments?.count > 0 {
                // 将新获取到的数据拼接在现有数据的后面
                self.comments = self.comments + comments!
                self.tableView.reloadData()
            }
        }
    }
    //MARK: - LRCommentsListHeaderViewDelegate 代理方法
    ///头部view评论按钮的点击
    func commentsListHeaderViewCommentButtonDidClick(button: UIButton) {
        loadNewComment()
    }
    //MARK: - LRCellBottomViewDelegate 代理方法
    ///转发按钮点击
    func forwardButtonDidClick() {
        let composeVc = LRComposeViewController(controllerType: LRComposeViewControllerType.Repost)
        composeVc.status = statues
        presentViewController(UINavigationController(rootViewController: composeVc), animated: true, completion: nil)
    }
    ///评论按钮点击
    func commentButtonDidClick() {
        let composeVc = LRComposeViewController(controllerType: LRComposeViewControllerType.Comment)
        composeVc.status = statues
        presentViewController(UINavigationController(rootViewController: composeVc), animated: true, completion: nil)
    }
    ///点赞按钮点击
    func lickButtonDidClick() {
        SVProgressHUD.showErrorWithStatus("没有开放该端口！")
    }
    //MARK: - LRStatuesCellDelegate 代理方法
    ///在当前控制器点击被转发的微博,再弹出一个控制器显示 被转发微博 详情
    func retweetedStatusDidClick(statues: LRStatues) {
        let detailVc = LRStatusDetailViewController(statues: statues)
        detailVc.hidesBottomBarWhenPushed = true
        //push不需要包装UINavigationController，自动有
        navigationController?.pushViewController(detailVc, animated: true)
    }
}

// MARK: - 扩展 CZStatusDetailViewController 实现 UITableViewDataSource 和 UITableViewDelegate协议
extension LRStatusDetailViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        /// 显示2组, 第一组显示微博内容,第二组显示转发或评论
        return 2
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            // 第0组显示微博内容.只有一个cell
            return 1
        }else {// 其他组显示 评论cell
            // 没有评论数据时返回 `没有评论cell`,数量为1
            return comments.count == 0 ? 1 : comments.count
        }
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // 第0组显示微博内容
        if indexPath.section == 0 {
            // 根据 微博模型 获取cell的 重用标示
            let cellId = LRStatusDetailIdentifier.cellId(statues)
            // 根据 重用标示 获取对应的cell
            let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! LRStatuesCell
            cell.delegate = self
            cell.statues = statues
            return cell
        } else {// 其他组显示评论
            // 如果没有数据显示 `还没有人评论`
            if comments.count == 0 {
                // 根据重用标示获取对应的cell
                let cell = tableView.dequeueReusableCellWithIdentifier(LRStatusDetailIdentifier.DetailNoCommentCell.rawValue) as! LRNoCommentCell
                // 设置没有数据时的消息提示
                cell.message = "还没有人评论!"
                return cell
            } else { // 有评论数据,显示评论数据
                // 获取 评论模型
                let commentModel = comments[indexPath.row]
                // 根据 评论模型 获取cell的 重用标示
                let cellId = LRStatusDetailIdentifier.cellId(commentModel)
                // 根据 重用标示 获取对应的cell
                let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! LRCommentCell
                cell.commentsModel = commentModel
                return cell
            }
        }
    }
    //MARK: - 返回每行高度
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 第0组显示微博内容,返回微博内容的高度
        if indexPath.section == 0 {
            // 根据 微博模型 获取cell的 重用标示
            let cellId = LRStatusDetailIdentifier.cellId(statues)
            // 根据 重用标示 获取对应的cell 这个方法不要用，会死循环
            //dequeueReusableCellWithIdentifier(<#T##identifier: String##String#>, forIndexPath: <#T##NSIndexPath#>)
            let cell = tableView.dequeueReusableCellWithIdentifier(cellId) as! LRStatuesCell
            return cell.rowHeight(statues)

        }else {
            // 其他组显示微博评论,根据自动约束 计算cell的高度
            return UITableViewAutomaticDimension
        }
    }
    //MARK: - 返回每组头部view
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        if section == 1 { // 第二组显示头部控件
            commentsListHeaderView.status = self.statues
            return commentsListHeaderView
        }else {
            return nil
        }
    }
    /// tableView每组头部高度
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        // 第一组显示头部控件,高度44 其他组没有头部控件
        return section == 1 ? 44 : 0
    }
    /// tableView每组脚部高度
    func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        // 第0组脚部控件高度10 其他组脚部控件高度0
        return section == 0 ? 10 : 0
    }
    /// tableView是否要高亮
    func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        if indexPath.section == 0 {     // 第0组是微博cell点击的时候不需要高亮
            return false
        } else {    // 其他组显示评论内容,点击cell需要高亮
            return true
        }
    }
}


















